<?php
/**
 * CK 快速开发框架
 * User: Clake
 * Date: 15/6/5
 * Time: 13:24
 */

namespace CK\Util\IO;

use \CK\Core\Base;

/**
 * Class File
 * 文件操作类
 * @package CK\Util\IO
 */
class File extends Base{

    /**
     * @var array File
     */
    private static $_instance=[];

    private $_f;

    private $_file_name;

    public function __construct($file_name) {
        $this->_file_name = $file_name;
        $this->_f = fopen($file_name, 'rwb');
    }

    /**
     * @param $file_name
     * 初始化当前类实例
     * @return mixed
     */
    public static function inst($file_name=null) {
        if (isset(self::$_instance[$file_name])) {
            return self::$_instance[$file_name];
        } else {
            self::$_instance[$file_name] = new self($file_name);
            return self::$_instance[$file_name];
        }
    }

    /**************************************************
     * 静态方法
     **************************************************/

    /**
     * 读取文件字符串内容
     *
     * @param      $file
     * @param null $flags
     * @param null $offset
     * @param null $maxlen
     *
     * @return string
     */
    public static function Read($file,$flags=null,$offset=null,$maxlen=null) {
        return file_get_contents($file);
    }

    /**
     * 把字符串写入文件
     *
     * @param      $file
     * @param      $content
     * @param bool $append
     *
     * @return int
     */
    public static function Write($file,$content,$append=false) {
        $flags = null;
        if ($append) {
            $flags = FILE_APPEND;
        }
        $dir = dirname($file);
        if (!Directory::Exists($dir)) {
            Directory::Create($dir);
        }
        return file_put_contents($file,$content,$flags);
    }

    /**
     * 返回该文件是否存在
     *
     * @param $file
     *
     * @return bool
     */
    public static function Exists($file) {
        return file_exists($file);
    }

    /**
     * 得到文件修改时间
     * @param $file
     *
     * @return int
     */
    public static function MTime($file) {
        return filemtime($file);
    }

    /**
     * 得到文件创建时间
     * @param $file
     *
     * @return int
     */
    public static function CTime($file) {
        return filectime($file);
    }

    /**
     * 得到文件大小
     * @param $file
     *
     * @return int
     */
    public static function Size($file) {
        return filesize($file);
    }

    /**
     * 得到文件类型
     * @param $file
     *
     * @return string
     */
    public static function Type($file) {
        return filetype($file);
    }

    /**
     * 复制文件到新目录
     * @param $old_file
     * @param $new_file
     *
     * @return bool
     */
    public static function Copy($old_file,$new_file) {
        return copy($old_file, $new_file);
    }

    /**
     * 删除一个文件
     * @param $file
     * @return bool
     */
    public static function Delete($file) {
        $file = Directory::RP($file);
        $flag = false;
        if (File::Exists($file)) {
            $flag = @unlink($file);
        }
        return $flag;
    }

    /**************************************************
     * 类对像方法
     **************************************************/

    public function getContent() {
        return self::Read($this->_file_name);
    }

    public function getLine() {
        return fgets($this->_f);
    }

    public function getLines() {
        return file($this->_file_name);
    }

    public function fread($length) {
        return fread($this->_f, $length);
    }

    public function seek($offset) {
        fseek($this->_f, $offset);
    }

    public function fwrite($string) {
        fwrite($this->_f, $string);
    }

    public function flush() {
        fflush($this->_f);
    }
}